//
//  WBNetworkManager.swift
//  MyWeibo
//
//  Created by timw on 2017/3/28.
//  Copyright © 2017年 wuqc. All rights reserved.
//

import UIKit
import AFNetworking

/// Swift 的枚举支持任意数据类型
/// switch / enum 在 OC 中都是支持整数
enum WBHTTPMethod {
    case GET
    case POST
}


/// 网络管理工具
class WBNetworkManager: AFHTTPSessionManager {
    /// 静态区/常量/在第一次访问时，执行闭包，并且将结果保存在shared常量中
    static let shared : WBNetworkManager = {
        // 实力化对象
        let instance = WBNetworkManager()
        
        //设置相应的反序列化支持的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        // 返回对象
        return instance
    }()
    
    /// 访问令牌，所有网络请求，都基于此令牌（登录除外）
    /// 为了保护用户安全，token是有时限的，默认用户是三天
    //var accessToken: String? //= "2.00j8lZ_E623pUBc5dfb9bfdc4x4cPD"
    
    /// 用户微博uid
    //var uids: String? = "3953805579"
    
    // 用户账户的懒加载属性
    lazy var userAccount = WBUserAccount()
    
    
    /// 用户登录标记[计算型属性]
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
    
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest(method: WBHTTPMethod = .GET, URLString: String, parameters:[String: Any]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool) -> ()) {
        /// 处理token字典
        // 0> 判断token是否为nil，为 nil 直接返回
        guard let token = userAccount.access_token else {
            // FIXME: 发送通知 提示用户再次登陆
            print("没有token！ 需要登录")
            completion(nil, false)
            return
        }
        // 1> 判断 参数字典是否存在，如果nil，新建一个字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String: Any]()
        }
        // 2> 设置参数字典，代码在此处字典一定有值
        parameters!["access_token"] = token
        
        /// 调用request 发起真正的网络请求
        request(method: method, URLString: URLString, parameters: parameters, completion: completion)
    }
    
    /// 封装AFN的GET/POST 请求
    ///
    /// - Parameters:
    ///   - method: GET / POST
    ///   - URLString: 请求地址
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[json(字典/数组)，是否成功]
    func request(method: WBHTTPMethod = .GET, URLString: String, parameters:[String: Any]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool) -> ()) {
        let success = {(task:URLSessionDataTask, json: Any?) -> () in
            completion(json,true)
        }
        let failure = {(task:URLSessionDataTask?, error: Error) -> () in
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token过期了")
                
                // FIXME: 发送通知 提示用户再次登陆（本方法不知道谁调用，谁接受到通知就谁处理）
            }
            
            print("网络请求错误\(error)")
            completion(nil,false)
        }
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }

    }
}
